home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / EnhanceMail.1.3 / Source / MailBox.m < prev    next >
Encoding:
Text File  |  1996-04-06  |  6.8 KB  |  238 lines

  1. /* -*-C-*-
  2. *******************************************************************************
  3. *
  4. * File:         MailBox.m
  5. * RCS:          $Header: /usr/local/lib/cvs/EnhanceMail/MailBox.m,v 1.1.1.16 1996/04/07 00:20:20 cedman Exp $
  6. * Description:  
  7. * Author:       Carl Edman
  8. * Created:      Fri Oct 13 11:48:05 1995
  9. * Modified:     Tue Apr  2 20:57:18 1996 (Carl Edman) cedman@capitalist.princeton.edu
  10. * Language:     C
  11. * Package:      N/A
  12. * Status:       Experimental (Do Not Distribute)
  13. *
  14. * (C) Copyright 1995, but otherwise this file is perfect freeware.
  15. *
  16. *******************************************************************************
  17. */
  18.  
  19. #import "EnhanceMail.h"
  20. #import "Preferences.h"
  21. #import "MailBox.h"
  22. #import "MailIndex.h"
  23. #import <libc.h>
  24. #import <indexing/indexing.h>
  25.  
  26. #define MSG_OPEN_MAILBOX NXLoadLocalizedStringFromTableInBundle("Alerts", nil, "Open Mailbox", NULL)
  27. #define MSG_REBUILD_INDEX NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "Rebuilding full-text index for %s.  Please wait...", NULL, Message for full text index progressor)
  28.  
  29. static HashTable *StoreNameHash=nil;
  30. static HashTable *ManagerHash=nil;
  31.  
  32. struct msgitem
  33.    {
  34.    int number;
  35.    int date;
  36.    struct mflagstruct mflag;
  37.    int totsize;
  38.    int int1;
  39.    int int2;
  40.    };
  41.  
  42. @implementation EnhanceMailBox
  43. + finishLoading:(struct mach_header *)header
  44.    {
  45.    [self poseAs:[self superclass]];
  46.    StoreNameHash=[[HashTable alloc] initKeyDesc:"@" valueDesc:"*"];
  47.    ManagerHash=[[HashTable alloc] initKeyDesc:"@" valueDesc:"@"];
  48.    return self;
  49.    }
  50.  
  51. + startUnloading
  52.    {
  53.    StoreNameHash=[StoreNameHash free];
  54.    ManagerHash=[ManagerHash free];
  55.    return self;
  56.    }
  57.  
  58. - initMailBox:(char *)name
  59.    {
  60.    char *storeName=0;
  61.    id manager=nil;
  62.    id ret=[super initMailBox:name];
  63.    
  64.    if (!dirname) return ret;
  65.    storeName=strcpy(malloc(strlen(dirname)+20),dirname);
  66.    strcat(storeName,"/content.store");
  67.    [StoreNameHash insertKey:self value:storeName];
  68.  
  69.    manager=[[IXRecordManager alloc] initFromName:"content" inFile:storeName forWriting:YES];
  70.    [ManagerHash insertKey:self value:manager];
  71.  
  72.    [self updateStore];
  73.    return ret;
  74.    }
  75.  
  76. - free
  77.    {
  78.    char *storeName=[StoreNameHash valueForKey:self];
  79.    id manager=[ManagerHash valueForKey:self];
  80.  
  81.    [StoreNameHash removeKey:self];
  82.    if (storeName) free(storeName);
  83.    
  84.    [ManagerHash removeKey:self];
  85.    if (manager)
  86.       {
  87.       id store=[manager store];
  88.       [store startTransaction];
  89.       [store compact];
  90.       [store commitTransaction];
  91.       manager=[manager free];
  92.       }
  93.    
  94.    return [super free];
  95.    }
  96.  
  97. - createStore
  98.    {
  99.    char *storeName=[StoreNameHash valueForKey:self];
  100.    id manager=[ManagerHash valueForKey:self];
  101.    id parser=[[IXAttributeParser alloc] init];
  102.  
  103.    if (!storeName) return nil;
  104.    if (manager==nil)
  105.       {
  106.       manager=[[IXRecordManager alloc] initWithName:"content" inFile:storeName];
  107.       [ManagerHash insertKey:self value:manager];
  108.       
  109.       [[manager store] startTransaction];
  110.       [manager addAttributeNamed:"msgId" forSelector:@selector(msgId)];
  111.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"msgId"];
  112.       [manager addAttributeNamed:"Content" forSelector:@selector(messageContent)];
  113.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Content"];
  114.       [manager setParser:parser forAttributeNamed:"Content"];
  115. #if 0
  116.       [manager addAttributeNamed:"Subject" forSelector:@selector(messageSubject)];
  117.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Subject"];
  118.       [manager addAttributeNamed:"From" forSelector:@selector(messageFrom)];
  119.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"From"];
  120.       [manager addAttributeNamed:"To" forSelector:@selector(messageTo)];
  121.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"To"];
  122.       [manager addAttributeNamed:"Cc" forSelector:@selector(messageCc)];
  123.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Cc"];
  124.       [manager addAttributeNamed:"Date" forSelector:@selector(messageDate)];
  125.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Date"];
  126.       [manager addAttributeNamed:"Message-Id" forSelector:@selector(messageId)];
  127.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Message-Id"];
  128.       [manager addAttributeNamed:"Next-Reference" forSelector:@selector(messageNextReference)];
  129.       [manager setTargetClass:[MailIndex class] forAttributeNamed:"Next-Reference"];
  130. #endif
  131.       [[manager store] commitTransaction];
  132.       }
  133.    return [self updateStore];   
  134.    }
  135.  
  136. - updateStore
  137.    {
  138.    id manager=[ManagerHash valueForKey:self];
  139.    struct mboxstatus stat;
  140.    int count;
  141.    Progressor *progress;
  142.    MailIndex *record;
  143.    char buf[MAXPATHLEN+1];
  144.  
  145.    if (manager==nil) return nil;
  146.    [self getMailboxStatus:&stat];
  147.    count=[manager count]-[manager attributeCount];
  148.    if (stat.msgno<=count) return self;
  149.    [[manager store] startTransaction];
  150.    
  151.    sprintf(buf,MSG_REBUILD_INDEX,dirname);
  152.    progress=[Progressor newWithTitle:MSG_OPEN_MAILBOX message:buf];
  153.    [progress setMinValue:count];
  154.    [progress setMaxValue:stat.msgno];
  155.    [progress setProgress:count];
  156.    [progress setShowProgress:YES];
  157.    [progress beginModalSession];
  158.    
  159.    [MailIndex setMailBox:self];
  160.    for(;(count<stat.msgno) && ![progress cancelled];count++)
  161.       {
  162.       record=[[MailIndex alloc] initMsgId:count];
  163.       [manager addRecord:record];
  164.       record=[record free];
  165.       [progress setProgress:count];
  166.       }
  167.    [MailIndex setMailBox:nil];
  168.    
  169.    [progress endModalSession];
  170.    [[manager store] commitTransaction];
  171.  
  172.    return (count>=stat.msgno) ? self : nil;
  173.    }
  174.  
  175. - deleteStore
  176.    {
  177.    char *storeName=[StoreNameHash valueForKey:self];
  178.    id manager=[ManagerHash valueForKey:self];
  179.       
  180.    if (!storeName)
  181.       return nil;
  182.  
  183.    if (manager)
  184.       [ManagerHash insertKey:self value:(manager=[manager free])];
  185.  
  186.    if (unlink(storeName)==-1)
  187.       return nil;
  188.  
  189.    return self;
  190.    }
  191.  
  192. - (BOOL)hasStore
  193.    {
  194.    id manager=[ManagerHash valueForKey:self];
  195.       
  196.    return (manager==nil) ? NO : YES;
  197.    }
  198.  
  199. - (int)storeSize
  200.    {
  201.    char *storeName=[StoreNameHash valueForKey:self];
  202.    id manager=[ManagerHash valueForKey:self];
  203.    struct stat buf;
  204.    
  205.    if ((manager==nil)||(storeName==0)||(stat(storeName,&buf)==-1)) return -1;
  206.    
  207.    return buf.st_size;
  208.    }
  209.  
  210. - (void)maybeUpdateToc
  211.    {
  212.    [super maybeUpdateToc];
  213.    [self updateStore];
  214.    }
  215.  
  216. - repairTocFile:(int)start
  217.    {
  218.    id ret=[super repairTocFile:start];
  219.    [self updateStore];
  220.    return ret;
  221.    }
  222.  
  223. - query:(const char *)expr
  224.    {
  225.    id manager,parser,query,list;
  226.  
  227.    manager=[ManagerHash valueForKey:self];
  228.    if (manager==nil) return nil;
  229.    parser=[manager parserForAttributeNamed:"Content"];
  230.    if (parser==nil) return nil;
  231.    query=[[IXAttributeQuery alloc] initQueryString:expr andAttributeParser:parser];
  232.    if (query==nil) return nil;
  233.    list=[query evaluateFor:manager];
  234.    [query free];
  235.    return list;
  236.    }
  237. @end
  238.